package com.ggh.handler;

import com.ggh.entity.UserBean;
import com.ggh.entity.RoomBeanP;
import com.ggh.util.SpecialBrand;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class BeginToJudgePKPSiRen {// 玩法：钓蟹：比牌
	// 计算牌型类
	private SpecialBrand spb = new SpecialBrand();
	private final static  int[] pai = { 12, 2, 8, 4, 10, 6, 4, 11,7,10, 6, 9, 9, 8, 8, 7, 7, 6, 5, 5, 3 };
	/*四张
	对比判断,参数：房间信息*/
	public void contrast(RoomBeanP room, UserBean u1, UserBean u2) {
		// 状态 0为和
		// 循环房间内的用户
		int a;// 上结果
		int b;// 下结果
		if (room.getGame_type()<5&&room.getGame_type()>2){
			// 根据游戏类型调取方法
			a = result(u1, u2, 0);
			b = result(u1, u2, 1);
			// 计算结果，扣分
			if (a == 2 && b == 2 || a == 0 && b == 2 || a == 2 && b == 0 || a == -1 && b == 2 || a == 2 && b == -1) {// 庄家输了
				u2.setHu_state(1);
			} else {// 除了庄家输，其他都算庄家赢
				u2.setHu_state(2);
			}
		}else if (room.getGame_type()>4){
			// 根据游戏类型调取方法
			a = result(u1, u2, 0);
			// 计算结果，扣分
			// 庄家输了
			if (a == 2 ) {
				u2.setHu_state(1);
			} else {// 除了庄家输，其他都算庄家赢
				u2.setHu_state(2);
			}
		}

	}
	/*
	* 两张
	* */

	// 对比结果： 0和
	public int result(UserBean u1, UserBean u2, int index) {

		System.out.println("index:" + index);
		// 1:比特殊牌型
		int j1 = specialPK(u1, u2, index);
		System.out.println("2张牌，特殊牌型结果：" + j1);
		if (j1 == -1) {
			// 比点子
			int j2 = numberPK(u1, u2, index);
			System.out.println("2张牌，点子结果：" + j2);
			return j2;
		} else {
			return j1;
		}

	}

	// 判断特殊牌型的方法，参数:str1-用户 1 的牌，str2-用户2的牌
	public int specialPK(UserBean u1, UserBean u2, int index) {
		int[] str1;
		int[] str2;
		if (index == 0) {
			str1 = new int[] { u1.getBrands().get(0), u1.getBrands().get(1) };
			str2 = new int[] { u2.getBrands().get(0), u2.getBrands().get(1) };
		} else {
			str1 = new int[] { u1.getBrands().get(2), u1.getBrands().get(3) };
			str2 = new int[] { u2.getBrands().get(2), u2.getBrands().get(3) };
		}

		// one<two,则one大，返回相对id,否则返回two的相对id,为0则不是特殊牌型
		int a=0;
		int b=0;
		HashMap pa=null;
		HashMap pb=null;
		if (u1.getBrands().size()<3){
			pa = spb.brandType(str1);
			a= (int) pa.get(1);
			pb = spb.brandType(str2);
			b= (int) pb.get(1);
		}else {
			pa = spb.brandTypeD(str1);
			a= (int) pa.get(1);
			pb = spb.brandTypeD(str2);
			b= (int) pb.get(1);
		}
		System.out.println("特殊牌型：a--" + a + "；b--" + b);
		if (a < b) {
			// 记录特殊牌型
			// a是特殊牌型
			u1.getPindex()[index] = a;
			u1.getPhanzi()[index] = (String) pa.get(2);
			if (b != 30) {
				u2.getPindex()[index] = b;
				u2.getPhanzi()[index] = (String) pb.get(2);
			} else {
				// 计算点子
				HashMap dz = spb.dz(str2);
				u2.getPindex()[index] = (int) dz.get(0);
				u2.getPhanzi()[index] = (String) dz.get(1);
			}
			return 1;// 庄赢
		} else if (a > b) {
			u2.getPindex()[index] = b;
			u2.getPhanzi()[index] = (String) pb.get(2);
			if (a != 30) {
				u1.getPindex()[index] = a;
				u1.getPhanzi()[index] = (String) pa.get(2);
			} else {
				// 计算点子
				HashMap dz = spb.dz(str1);
				u1.getPindex()[index] = (int) dz.get(0);
				u1.getPhanzi()[index] = (String) dz.get(1);
			}
			return 2;// 闲赢
		} else { // 如果两者相同（两者相同==0，可能都不是特殊牌型），返回-1
			return -1;
		}
	}

	// 计算点子
	public int dz(int[] str) {
		int a1 = pai[str[0]];
		int a2 = pai[str[1]];
		int o1 = a1 + a2;
		return (o1 % 10) + 22;// 点子
	}

	// 判断点子数
	public int numberPK(UserBean u1, UserBean u2, int index) {
		int[] str1;
		int[] str2;

		int o1 = 0;
		int o2 = 0;
		int p1 = 0;
		int p2 = 0;
		if (index == 0) {
			o1 = pai[u1.getBrands().get(0)] + pai[u1.getBrands().get(1)];
			o2 = pai[u2.getBrands().get(0)] + pai[u2.getBrands().get(1)];
			/*
			点数相同的情况
			* */
			if ( u1.getBrands().get(0)<u1.getBrands().get(1)){
				p1 = u1.getBrands().get(0);
			}else {
				p1 = u1.getBrands().get(1);
			}
			if ( u2.getBrands().get(0)<u2.getBrands().get(1)){
				p2 = u2.getBrands().get(0);
			}else {
				p2 = u2.getBrands().get(1);
			}


		} else {
			o1 = pai[u1.getBrands().get(2)] + pai[u1.getBrands().get(3)];
			o2 = pai[u2.getBrands().get(2)] + pai[u2.getBrands().get(3)];
			if ( u1.getBrands().get(2)<u1.getBrands().get(3)){
				p1 = u1.getBrands().get(2);
			}else {
				p1 = u1.getBrands().get(3);
			}
			if ( u2.getBrands().get(2)<u2.getBrands().get(3)){
				p2 = u2.getBrands().get(2);
			}else {
				p2 = u2.getBrands().get(3);
			}

		}

		System.out.println("点子结果：a:" + (o1 >= 10 ? o1 % 10 : o1) + ",b:" + (o2 >= 10 ? o2 % 10 : o2));

		// 存储用户点子
		u1.getPindex()[index] = (o1 % 10) + 22;
		u2.getPindex()[index] = (o2 % 10) + 22;

		if ((o1 >= 10 ? o1 % 10 : o1) > (o2 >= 10 ? o2 % 10 : o2)) {
			System.out.println("点子：1");
			return 1;// 庄赢
		} else if ((o1 >= 10 ? o1 % 10 : o1) < (o2 >= 10 ? o2 % 10 : o2)) {
			System.out.println("点子：2");
			return 2;// 闲赢
		}else if ((o1 >= 10 ? o1 % 10 : o1) == (o2 >= 10 ? o2 % 10 : o2)){
			if (p1>p2){
				return 2;//闲赢
			}else {
				return 1;// 庄赢
			}
		}
		System.out.println("点子：-1");
		return -1;// 相同
	}


	// 提示
	public List<Integer> tips(List<Integer> brandn) {
		List<Integer> brands=new ArrayList<>(brandn);
		// 先判断是否有特殊牌型
		int pts=40;
		int pi=0;
		int pj=0;
		int pdz=0;
		for (int i = 0; i < brands.size() - 1; i++) {
			for (int j = i + 1; j < brands.size(); j++) {
				HashMap map=null;
				if (brands.size()<3){
					map = spb.brandType(new int[]{brands.get(i), brands.get(j)});
				}else {
					map = spb.brandTypeD(new int[]{brands.get(i), brands.get(j)});
				}

				int a= (int) map.get(1);
				if (a == 30) {
					a = pai[brands.get(i)] + pai[brands.get(j)];
					a = a % 10 + 22;
					if (a>pdz){
						pdz=a;
						pj=j;
						pi=i;
					}
				}
				if (a<pts){
					pts=a;
					pj=j;
					pi=i;
				}
			}
		}
		/*
		* 牌型互换
		* */
		if (pi!=0&&pj!=1||pj!=0&&pi!=1){
			Collections.swap(brands,pi,0);
			Collections.swap(brands,pj,1);
		}
		if (pi==0&&pj!=1){
			Collections.swap(brands,pj,1);
		}
		if (pj==0&&pi!=1){
			Collections.swap(brands,pi,1);
		}
		if (pi==1&&pj==0){
			Collections.swap(brands,pj,0);
		}
		if (pj==1&&pi!=0){
			Collections.swap(brands,pi,0);
		}

		return brands;
	}

	// 确定组牌，后台自动排序
	public List<Integer> reordering(List<Integer> brands) {
		List<Integer> list = new ArrayList<Integer>();
		// 先判断 特殊牌型
		int[] str1 = new int[] { brands.get(0), brands.get(1) };
		int[] str2 = new int[] { brands.get(2), brands.get(3) };
		System.out.println("重新排序前：str1:" + str1[0] + "-" + str1[1] + "/str2:" + str2[0] + "-" + str2[1]);
		HashMap pa = spb.brandType(str1);
		int a= (int) pa.get(1);
		HashMap pb = spb.brandType(str2);
		int b = (int) pb.get(1);
		if (a < b) {// 01 大 23小
			list.add(brands.get(2));
			list.add(brands.get(3));
			list.add(brands.get(0));
			list.add(brands.get(1));
			return list;
		} else if (a > b) {// 23 大01小
			list.add(brands.get(0));
			list.add(brands.get(1));
			list.add(brands.get(2));
			list.add(brands.get(3));
			return list;
		} else { // 如果两者相同（两者相同==0，可能都不是特殊牌型），返回-1
			// 计算点子
			HashMap dz = spb.dz(str1);
			a= (int) dz.get(0);
			HashMap dz1 = spb.dz(str1);
			b =(int) dz1.get(0);
			// 判断是否互换


			if (a > b) {// 01 大 23小
				list.add(brands.get(2));
				list.add(brands.get(3));
				list.add(brands.get(0));
				list.add(brands.get(1));
				return list;
			} else if (a < b) {// 23 大01小
				list.add(brands.get(0));
				list.add(brands.get(1));
				list.add(brands.get(2));
				list.add(brands.get(3));
				return list;
			} else {
				return brands;
			}
		}

	}
	/*
	 * 算牌
	 * */
	public  void card(UserBean userBean){
		HashMap dz=null;
		List<Integer> brands = userBean.getBrands();
		int[] str;
		str= new int[]{userBean.getBrands().get(0), userBean.getBrands().get(1)};

		HashMap map = spb.brandType(str);
		if (30 == (int)map.get(1)){
			dz = spb.dz(str);
			userBean.getPhanzi()[0]= (String) dz.get(1);
		}else {
			userBean.getPhanzi()[0]= (String) map.get(2);
		}
	}

	/**
	* @description :四人比牌
	* @param room
	* @param u1
	* @param u2
	* @date : 2019/10/18 15:30
	* @author : jj
	*/
	public void contrastSr(RoomBeanP room, UserBean u1, UserBean u2) {
		// 状态 0为和
		// 循环房间内的用户
		int a;// 上结果
		int b;// 下结果
		if (room.getGame_type()<5&&room.getGame_type()>2){
			// 根据游戏类型调取方法
			a = result(u1, u2, 0);
			b = result(u1, u2, 1);
			// 计算结果，扣分
			// 判断庄家因的条件：a == 1 && b == 1 || a == 0 && b == 1 || a == 1 && b == 0
			if (a == 2 && b == 2 || a == 0 && b == 2 || a == 2 && b == 0 || a == -1 && b == 2 || a == 2 && b == -1) {// 庄家输了
				u2.setHu_state(1);
			} else {// 除了庄家输，其他都算庄家赢
				u2.setHu_state(2);
			}
		}else if (room.getGame_type()>4){
			// 根据游戏类型调取方法
			a = result(u1, u2, 0);
			// 计算结果，扣分
			// 判断庄家因的条件：a == 1 && b == 1 || a == 0 && b == 1 || a == 1 && b == 0
			// 庄家输了
			if (a == 2 ) {
				u2.setHu_state(1);
			} else {// 除了庄家输，其他都算庄家赢
				u2.setHu_state(2);
			}
		}

	}
	/**
	* @description :判断下注的可以金额
	* @param userBean
	* @date : 2019/10/19 11:45
	* @author : jj
	*/
	public  void  port(UserBean userBean){
		int s=pai[userBean.getBrands().get(0)]+pai[userBean.getBrands().get(1)];
		if (s%10>8){
			userBean.getPotList().add(userBean.getFirst());
			userBean.getPotList().add(userBean.getSecond());
			userBean.getPotList().add(userBean.getThird());
		}
		if (s%10==8){
			userBean.getPotList().add(userBean.getFirst());
			userBean.getPotList().add(userBean.getSecond());
		}
		if (s%10<8){
			userBean.getPotList().add(userBean.getFirst());
		}
	}
	public static void main(String[] args) {
		BeginToJudgePKPSiRen btj = new BeginToJudgePKPSiRen();
			List<Integer> brands = new ArrayList<Integer>();
			brands.add(11);
			brands.add(15);
			brands.add(1);
			brands.add(1);
		List<Integer> tips = btj.tips(brands);
		System.out.println(tips);
		// List<Integer> bb = btj.reordering(brands, 1);
		// System.out.println(bb);
		// System.out.println("重新排序后：str1:" + bb.get(0) + "-" + bb.get(1) +
		// "/str2:" + bb.get(2) + "-" + bb.get(3));

		// List<Integer> brands = new ArrayList<Integer>();
		// brands.clear();
		// int[] pai = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,
		// 9, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
		// 18, 19, 20 };
	}

}
